import xml.etree.ElementTree as ET
import struct
import os
import sys
from collections import defaultdict

# === Entradas manuales ===
if len(sys.argv) != 3:
    print("Uso: python script.py <archivo_entrada.tmx> <archivo_salida.bin>")
    sys.exit(1)

nombre_mapa = sys.argv[1]
pathOutput = sys.argv[2]

# === Directorios base ===
script_dir = os.path.dirname(os.path.abspath(__file__))
base_dir = os.path.normpath(os.path.join(script_dir, "..", ".."))  # directorio del proyecto

tmx_path = os.path.join(base_dir, nombre_mapa)
pathOutput = os.path.join(base_dir, pathOutput)

tree = ET.parse(tmx_path)
root = tree.getroot()

chunks = root.findall('.//chunk')

header = bytearray()
data = bytearray()
offsets = []

# Agrupar chunks por coordenadas (x, y)
chunk_map = defaultdict(list)
for chunk in chunks:
    x = int(chunk.attrib['x']) // 32
    y = int(chunk.attrib['y']) // 24
    raw_data = chunk.text.strip().replace('\n', '')
    values = list(map(int, raw_data.split(',')))
    chunk_map[(x, y)].append(values)

# Procesar cada grupo de chunks (superposición de capas)
for (x, y), chunk_list in chunk_map.items():
    if len(chunk_list) <= 1:
        continue  # No hay chunks subsiguientes, nada que hacer

    bloque = bytearray()  # <-- inicializamos bloque vacío por cada (x,y)

    # Recorremos todos los chunks subsiguientes (excluyendo el primero)
    for other_chunk in chunk_list[1:]:
        mapa_bits = bytearray(96)
        for i in range(96):
            mapa_bits[i] = 0

        for i, valor in enumerate(other_chunk):
            if valor > 0:
                byte_index = i // 8
                bit_index = 7 - (i % 8)
                mapa_bits[byte_index] |= (1 << bit_index)

        bloque += mapa_bits  # Agregamos el mapa_bits al bloque

    # Guardar bloque resultante
    offset = len(data)
    data.extend(bloque)
    offsets.append((x, y, offset))
    

# Crear encabezado
for x, y, offset in offsets:
    header += struct.pack('<bbH', x, y, offset)

# Escribir el archivo binario
with open(pathOutput, 'wb') as f:
    f.write(header)
    f.write(data)

print(f"Archivo generado: {pathOutput}")

# === Generar archivo .txt auxiliar ===
bin_dir = os.path.dirname(pathOutput)
bin_filename = os.path.basename(pathOutput)
txt_dir = os.path.join(bin_dir, "txts")
os.makedirs(txt_dir, exist_ok=True)

txt_filename = os.path.splitext(bin_filename)[0] + ".txt"
txt_path = os.path.join(txt_dir, txt_filename)

header_len = len(header)
data_len = len(data)
map_offset = header_len

# Crear líneas de texto
line1 = "2                      MAP FILE "
line2 = f"{0:<8}{header_len:<8}{'layer_header':<15}"
line3 = f"{map_offset:<8}{data_len:<8}{'start_layer':<15}"

with open(txt_path, 'w') as f:
    f.write(line1 + "\n")
    f.write(line2 + "\n")
    f.write(line3 + "\n")

print(f"Archivo TXT generado: {txt_path}")
